package com.rzjm.exercise.common.base.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rzjm.exercise.common.base.data.DataTable;
import com.rzjm.exercise.common.base.data.DataTableLayUI;
import com.rzjm.exercise.sys.core.dict.annotation.DictBody;

/**
 *
 * @author chen
 */
public interface BaseService<T> extends IService<T> {

	@DictBody
	default T findById(Serializable id) {
		return getById(id);
	}

    /**
     * 根据map参数查询数量
     *
     * @param params
     * @return
     */
	long selectCountByMap(Map<String, Object> params);

	/**
	 * 根据QueryWrapper参数查询数量
	 *
	 * @param qw
	 * @return
	 */
	long selectCountByQueryWrapper(QueryWrapper<T> qw);


	/**
	 * 根据一列值查询数量
	 * @param column
	 * @param value
	 * @return
	 */
	long selectCountByColumn(String column, Object value);

	List<T> selectListByColumn(String column, Object value);


	List<T> selectListByQueryWrapper(QueryWrapper<T> qw);

    /**
     * 通过一列值查询
     * @return
     */
    List<T> selectByMap(Map<String, Object> params);

	/**
     * 通过一唯一列值查询唯一值
     *
     * @param column
     * @param value
     * @return
     */
    T selectByUniqueColumn(String column, Object value);

    /**
     * 查询表上所有数据
     *
     * @return
     */
    List<T> selectAllList();


	/**
	 * DateTable 分页查询
	 * @param condition
	 * @return
	 */
	@DictBody
    DataTable<T> pageSearch(DataTable<T> condition);

	/**
	 * DateTable 分页查询
	 * @param condition
	 * @return
	 */
	@DictBody
	DataTableLayUI<T> pageSearchLayUI(DataTableLayUI<T> condition);

	/**
	 * DateTable 分页查询
	 * @param condition
	 * @return
	 */
	@DictBody
	DataTableLayUI<T> pageSearchCustom(Page<T> page, List<T> list, DataTableLayUI<T> condition);

	/**
	 * 查询下拉列表
	 *
	 * @param params
	 */
	default List<T> selectOptionsList(String params) {
		return this.selectOptionsList();
	}

	/**
	 * 查询下拉列表
	 */
	default List<T> selectOptionsList() {
		return this.selectAllList();
	}

	Page<T> getPage(DataTableLayUI<T> condition);
}
